package coreapi;

import cn.lkk.utils.PrintUtils;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * 演示 ServletContext 对象的是使用
 */
public class ServletContextUsage extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 获取ServletContext 对象的方式有很多种，但是得到的都是同一个对象
        ServletContext servletContext = getServletContext();
        ServletContext servletContext1 = getServletConfig().getServletContext();
        ServletContext servletContext2 = req.getServletContext();
        System.out.println(servletContext == servletContext1);
        System.out.println(servletContext1 == servletContext2);

        manipulateAttribute(servletContext);
        readContextInitParameter(servletContext);
        retriveResource(servletContext);
    }

    /**
     * 使用 ServletContext 存取属性
     */
    public void manipulateAttribute(ServletContext servletContext) {

        // 添加属性
        servletContext.setAttribute("addTime", new Date());
        // 获取所有属性名
        Enumeration<String> attrNames = servletContext.getAttributeNames();
        // 查找属性
        Date addTime = (Date) servletContext.getAttribute("addTime");
        // 移除属性
        servletContext.removeAttribute("addTime");
        System.out.println(addTime);
    }

    /**
     * 读取应用程序初始化参数
     */
    public void readContextInitParameter(ServletContext servletContext) {

        // 获取所有的初始化参数名
        Enumeration<String> params = servletContext.getInitParameterNames();
        while (params.hasMoreElements()) {
            String param = params.nextElement();
            // 获取指定的初始化参数值
            System.out.println(param + " = " + servletContext.getInitParameter(param));
        }
    }

    /**
     * 使用 ServletContext 对象获取项目资源
     */
    public void retriveResource(ServletContext servletContext) {

        //将URI转换成物理路径
        String projectpath = servletContext.getRealPath("/");
        System.out.println(projectpath);

        //获得 web 应用的目录下的资源
        InputStream in = servletContext.getResourceAsStream("/WEB-INF/data.txt");
        cn.lkk.utils.PrintUtils.printContent(in);

        //获取指定目录下的所有资源路径
        Set<String> paths = servletContext.getResourcePaths("/WEB-INF");
        for (String path : paths)
            System.out.println(path);

        //=================获得类路径下的资源==================

        //使用 Class 对象获取该类相对路径下的资源
        in = this.getClass().getResourceAsStream("data.txt");
        PrintUtils.printContent(in);

        //使用 Class 对象获取 classpath 下的资源
        in = getClass().getResourceAsStream("/data.txt");
        PrintUtils.printContent(in);

        //使用 Classloader 获取 classpath 下的资源
        in = getClass().getClassLoader().getResourceAsStream("data.txt");
        PrintUtils.printContent(in);
    }
}
